// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraVerbMessageReplication.h"

#include "GameFramework/GameplayMessageSubsystem.h"
#include "Messages/LyraVerbMessage.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraVerbMessageReplication)

//////////////////////////////////////////////////////////////////////
// FLyraVerbMessageReplicationEntry

/**
 * 获取复制条目的调试字符串
 * @return 消息的字符串表示
 */
FString FLyraVerbMessageReplicationEntry::GetDebugString() const
{
	return Message.ToString(); // 返回消息的字符串表示
}

//////////////////////////////////////////////////////////////////////
// FLyraVerbMessageReplication

/**
 * 添加消息到复制列表
 * @param Message 要添加的动词消息
 */
void FLyraVerbMessageReplication::AddMessage(const FLyraVerbMessage& Message)
{
	FLyraVerbMessageReplicationEntry& NewStack = CurrentMessages.Emplace_GetRef(Message); // 在数组末尾构造新条目并获取引用
	MarkItemDirty(NewStack); // 标记条目为脏以触发复制
}

/**
 * 复制移除前的处理（当前未实现具体逻辑）
 * @param RemovedIndices 被移除的索引数组视图
 * @param FinalSize 最终大小
 */
void FLyraVerbMessageReplication::PreReplicatedRemove(const TArrayView<int32> RemovedIndices, int32 FinalSize)
{
// 	for (int32 Index : RemovedIndices) // 遍历被移除的索引
// 	{
// 		const FGameplayTag Tag = CurrentMessages[Index].Tag; // 获取被移除条目的标签
// 		TagToCountMap.Remove(Tag); // 从标签计数映射中移除
// 	}
}

/**
 * 复制添加后的处理，重新广播添加的消息
 * @param AddedIndices 被添加的索引数组视图
 * @param FinalSize 最终大小
 */
void FLyraVerbMessageReplication::PostReplicatedAdd(const TArrayView<int32> AddedIndices, int32 FinalSize)
{
	for (int32 Index : AddedIndices) // 遍历被添加的索引
	{
		const FLyraVerbMessageReplicationEntry& Entry = CurrentMessages[Index]; // 获取添加的条目
		RebroadcastMessage(Entry.Message); // 重新广播消息
	}
}

/**
 * 复制变更后的处理，重新广播变更的消息
 * @param ChangedIndices 被变更的索引数组视图
 * @param FinalSize 最终大小
 */
void FLyraVerbMessageReplication::PostReplicatedChange(const TArrayView<int32> ChangedIndices, int32 FinalSize)
{
	for (int32 Index : ChangedIndices) // 遍历被变更的索引
	{
		const FLyraVerbMessageReplicationEntry& Entry = CurrentMessages[Index]; // 获取变更的条目
		RebroadcastMessage(Entry.Message); // 重新广播消息
	}
}

/**
 * 重新广播消息到消息子系统
 * @param Message 要广播的消息
 */
void FLyraVerbMessageReplication::RebroadcastMessage(const FLyraVerbMessage& Message)
{
	check(Owner); // 检查所有者是否有效
	UGameplayMessageSubsystem& MessageSystem = UGameplayMessageSubsystem::Get(Owner); // 获取消息子系统实例
	MessageSystem.BroadcastMessage(Message.Verb, Message); // 广播消息
}